package com.gmsk.pocket.service.impl;

import com.gmsk.pocket.config.BaseConfig;
import com.gmsk.pocket.dao.DocFileMapper;
import com.gmsk.pocket.entity.DocFile;
import com.gmsk.pocket.helper.HdfsFileSystem;
import com.gmsk.pocket.indexing.DocFileRepository;
import com.gmsk.pocket.service.DocFileService;
import com.gmsk.pocket.utils.OfficeUtils;
import com.gmsk.pocket.utils.TikaUtils;
import com.hankcs.hanlp.HanLP;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.io.File;
import java.io.IOException;
import java.util.List;

@Service
public class DocFileServiceImpl implements DocFileService {

    Logger logger = LoggerFactory.getLogger(DocFileServiceImpl.class);

    @Autowired
    DocFileMapper docFileMapper;

    @Autowired
    DocFileRepository docFileRepository;


    @Autowired
    private BaseConfig baseConfig;

    @Value("${fileUpload.tmpDir}")
    private String TMPDIR;

    @Value("${hdfs.URILocation}")
    private String HDFS_URI;

    @Override
    public int insert(DocFile docFile) {
        return docFileMapper.insert(docFile);
    }

    @Override
    public int update(DocFile docFile) {
        return docFileMapper.updateByPrimaryKey(docFile);
    }

    @Override
    public int delete(Integer id) {
        return docFileMapper.deleteByPrimaryKey(id);
    }

    @Override
    public DocFile select(Integer id) {
        return docFileMapper.selectByPrimaryKey(id);
    }

    @Override
    public List<DocFile> selectByDocId(Integer docId) {
        return docFileMapper.selectDocFileByDocId(docId);
    }

    @Override
    public void transFile(DocFile docFile) {
        logger.info("index Task docId:{},docName:{}", docFile.getDocId(), docFile.getFileName());
        if (docFile == null) {
            logger.error("docfile is null");
        } else {
            File file = new File(TMPDIR + docFile.getFileName());
            if (file.exists()) {
                if(docFile.getFileType().equals("doc") ||
                        docFile.getFileType().equals("docx") ||
                        docFile.getFileType().equals("xlsx")||
                        docFile.getFileType().equals("xls") ||
                        docFile.getFileType().equals("ppt") ||
                        docFile.getFileType().equals("pptx") ||
                        docFile.getFileType().equals("pdf")) {
                    String content = TikaUtils.parseContent(file);
                    if (content == null) {
                        docFile.setFileIndex(0);
                        logger.error("tika解析文件内容出错,fileId:{}", file.getAbsolutePath());
                    } else {
                        docFile.setFileIndex(1);
                        docFile.setFileContent(content);
                    }
                }
                if(docFile.getFileType().equals("doc") ||
                        docFile.getFileType().equals("docx") ||
                        docFile.getFileType().equals("xlsx")||
                        docFile.getFileType().equals("xls") ||
                        docFile.getFileType().equals("ppt") ||
                        docFile.getFileType().equals("pptx")) {
                    File targetDir = new File(file.getParentFile(), "pdf");
                    File targetFile = OfficeUtils.convertPdf(baseConfig.getSofficePath(), file, targetDir);
                    if (targetFile == null) {
                        docFile.setFileConvert(2);
                        logger.error("文档转换失败,{}", docFile.getFileName());
                    } else {
                        docFile.setFileConvert(1);
                        logger.info("文档转换成功,{}", docFile.getFileName());
                        // 把PDF也保存到hdfs上
                        try {
                            HdfsFileSystem.copyFileToHDFSByFileObj(targetFile, HDFS_URI + "/" + targetFile.getName());
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
                this.saveDocToEs(docFile);
                docFile.setFileContent(null);
                update(docFile);
                file.delete();
            } else {
                logger.error("file not exists,docId:{}", docFile.getDocId());
            }
        }
    }


    public void saveDocToEs(DocFile doc) {
        docFileRepository.save(doc);
    }
}
